package seqlist;

import java.util.Arrays;

public class DynamicArray {
    //定义属性
    //elemenData就是具体存储元素的数组
    private int [] elementData;
    //当前动态数组中存储了几个元素
    private int size;

    public DynamicArray(int size){
        elementData=new int[size];
    }
    public DynamicArray(){
        elementData=new int[10];
    }



    //在数组头部添加元素
    public void addFirst(int data){
        //此时数组已满，需要扩容
        if(size==elementData.length){
            grow();
        }
        for (int i = size-1; i >=0; i--) {
            elementData[i+1]=elementData[i];
        }
        //此时第一个元素空出来了  将数据插入头部
        elementData[0]=data;
        size++;

    }


     //在数组尾部插入元素
    public void addLast(int data){
        if(size==elementData.length){
            grow();
        }
        elementData[size]=data;
        size++;

    }

    //在数组的索引index处添加元素
    public void addIndex(int index,int data){
        //先判断边界条件index是否合法
        //index=0->头插
        //index=size->尾插
        if(index<0 || index>size){
            System.out.println("此时的index不合法，index>0||index<=size");
            return;
        }
        //判断数组是否满
        if(size==elementData.length){
            grow();
        }
        if(index==0){
            addFirst(data);
        }
        if(index==size){
            addLast(data);
        }else {
            for (int i = size - 1; i >= index; i--) {
                elementData[i + 1] = elementData[i];
            }
        }
        //此时index位置已经空出来，填入数据
        elementData[index]=data;
        size++;

    }

    //修改数组中的值
    public int set(int index, int newData){
        if(rangeCheck(index)){
            int oldValue=elementData[index];
            elementData[index]=newData;
            return oldValue;
            }
        return -1;
        }

        //查询下标所对应的值
    public int get(int index){
        if(rangeCheck(index)){
            return elementData[index];
        }
        return -1;
    }
    //判断数组中是否包含该元素
    public boolean contains(int data){
        for (int i = 0; i < size; i++) {
            if(data==elementData[i]){
                return true;
            }

        }
      return false;
    }



    //删除数组中的元素

   //删除下标对应的元素(0...1)
    public void remove(int index){
        if(rangeCheck(index)) {
            for (int i = index; i < size-1; i++) {
                elementData[i ] = elementData[i+1];

            }
            size--;
            //删除最后一个元素
            elementData[size]=0;
        }
    }

    //删除给定的值（0...N)
    public void  removeValue(int value){
        for (int i = 0; i < size; i++) {
            while(value==elementData[i] && i<size){
                //此时位置i就是待删除的元素下标
                remove(i);
            }

        }
    }
    //取得当前数组长度
    public  int getSize(){
        return size;
    }

    //内部扩容方法
    private void grow(){
        int oldLength=elementData.length;
        int newLength=oldLength << 1;
        //将原数组搬移到新数组 拷贝
        elementData= Arrays.copyOf(elementData,newLength);

    }


    //检查index是否合法（用于查询，修改，删除）
    private boolean rangeCheck(int index){
        if(index<0  || index>=size){
            System.err.println("此时的index不合法，index>=0||index<size");
            return false;
        }
        return true;
    }

    //将数组中的元素转化为字符串
    public String toString(){
        String ret="[";
        for (int i = 0; i < size; i++) {
            ret+=elementData[i];
            if(i!=size-1){
                ret+=",";
            }
        }
        ret+="]";
        return ret;
    }

    public static void main(String[] args) {
        DynamicArray dynamicArray=new DynamicArray();
        dynamicArray.addFirst(1);
        dynamicArray.addFirst(2);
        dynamicArray.addFirst(3);
        dynamicArray.addLast(5);
        dynamicArray.addIndex(2,2);
        //[2,2,2,1,2]
//        System.out.println(dynamicArray);
        dynamicArray.set(2,3);
        //[3，2，2，1，5]
        System.out.println(dynamicArray);
//        dynamicArray.remove(2);
//        System.out.println(dynamicArray);
//        dynamicArray.removeValue(2);
//        System.out.println(dynamicArray);
//        int ret=dynamicArray.get(2);
//        System.out.println(ret);
        System.out.println(dynamicArray.contains(5));
        System.out.println(dynamicArray.contains(34));
//        System.out.println(dynamicArray.getSize());

    }

}

